/**
 * 
 */
package com.smzd.framework.utils;

import java.io.Serializable;
import java.util.List;

import org.apache.commons.lang.StringUtils;

import com.smzd.core.domain.IRole;

/**
 * @author YuZhongda
 * 
 */
public class Privilege implements Serializable {
    private static final long serialVersionUID = -6304428570194017683L;
    private List<? extends IRole> roles;

    public List<? extends IRole> getRoles() {
        return roles;
    }

    public void setRoles(List<? extends IRole> roles) {
        this.roles = roles;
    }

    public Privilege() {
    }

    public Privilege(List<? extends IRole> roles) {
        setRoles(roles);
    }

    public int hasTag(String tag) {
        if (StringUtils.isEmpty(tag)) {
            return 1;
        }
        if (roles == null || roles.size() == 0) {
            return 0;
        }
        boolean disabled = false;
        for (IRole role : roles) {
            if (role != null) {
                String value = role.getValue();
                if (value != null && value.equals(tag)) {
                    if (role.isDisabled()) {
                        disabled = true;
                    } else {
                        return 1;
                    }
                }
            }
        }
        if (disabled) {
            return -1;
        }
        return 0;
    }

    /**
     * hasTag: 对于给出的需求角色数组，返回是否有权访问的标记。<br>
     * 0: 不能访问<br>
     * 1：可以访问<br>
     * -1：有授权，但该授权被禁止<br>
     * <br>
     * 如果给出来的需求数组为空，则无论privilege里面有什么，都认为可以访问，否则<br>
     * 如果privilege里面没有东西，则认为不能访问；否则<br>
     * 逐项比对，如果有可用的Role，则返回1，能够访问；如果可用的Role被disable，则先标记被禁用，继续查找<br>
     * 当都查找完毕，只有被禁用的Role时，返回-1，表示有授权，但被禁用了该授权。
     * 
     * @param tags
     * @return
     */
    public int hasTag(String[] tags) {
        if (tags == null || tags.length == 0) {
            return 1;
        }
        if (roles == null || roles.size() == 0) {
            return 0;
        }
        boolean disabled = false;
        for (IRole role : roles) {
            if (role == null || role.getValue() == null) {
                continue;
            }
            for (String tag : tags) {
                if (tag != null && role.getValue().equals(tag)) {
                    if (role.isDisabled()) {
                        disabled = true;
                        break;
                    } else {
                        return 1;
                    }
                }
            }
        }
        if (disabled) {
            return -1;
        }
        return 0;
    }

    @Override
    public String toString() {
        StringBuffer sb = new StringBuffer("Privilege@").append(this.hashCode()).append("{roles:").append(roles)
                .append("}");
        return sb.toString();
    }
}
